﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Persistencia;
using GestorDeFlotasModelo.Entities;
using System.Data.SqlClient;
using Persistencia.Interfaces;

namespace GestorDeFlotasModelo.Factorias
{
    public class FactoriaAuto : Factoria, IIdentityFactory
    {
        private FactoriaAuto(TransaccionBase tran)
            : base(tran)
        {
        }
       
        public override string NombreTabla
        {
            get { return " NUESTRA_RUBIA_ES_MEJOR.Auto "; }
        }

        protected override IPersistibleModelo NuevoPersistible(HashTableNCSensitive htsNc)
        {
            return new Auto();
        }

        protected override string Id(HashTableNCSensitive hts)
        {
            return hts["Auto_Id"].ToString();
        }

        protected override HashTableNCSensitive ParametrosClave()
        {
            HashTableNCSensitive parameters = new HashTableNCSensitive();
            parameters.Add("Auto_Id", null);
            return parameters;
        }

        protected override HashTableNCSensitive ParametrosNoClave()
        {
            HashTableNCSensitive parameters = new HashTableNCSensitive();
            parameters.Add("Auto_Marca", null);
            parameters.Add("Auto_Modelo", null);
            parameters.Add("Auto_Patente", null);
            parameters.Add("Auto_Licencia", null);
            parameters.Add("Auto_Rodado", null);
            parameters.Add("Auto_Habilitado", null);
            parameters.Add("Auto_Reloj", null);
            return parameters;
        }

        public List<Auto> SelectAutosConFiltro(string marca, string modelo, string patente, string licencia, Int64 reloj)
        {
            string where = " WHERE ((@Modelo IS NULL OR  Auto_Modelo LIKE '%' + @Modelo + '%') AND "
                                 + "(@Marca IS NULL OR Auto_Marca = @Marca) AND"
                                 + "(@Patente IS NULL OR Auto_Patente LIKE '%' + @Patente + '%') AND "
                                 + "(@Licencia IS NULL OR Auto_Licencia LIKE '%' + @Licencia + '%') AND "
                                 + "(@IdReloj IS NULL OR Auto_Reloj = @IdReloj)) ";
            List<SqlParameter> parametros = new List<SqlParameter>();
            if(modelo != null)
                parametros.Add(new SqlParameter("@Modelo", modelo));
            else
                parametros.Add(new SqlParameter("@Modelo", System.DBNull.Value));

            if (patente != null)
                parametros.Add(new SqlParameter("@Patente", patente));
            else
                parametros.Add(new SqlParameter("@Patente", System.DBNull.Value));

            if (licencia != null)
                parametros.Add(new SqlParameter("@Licencia", licencia));
            else
                parametros.Add(new SqlParameter("@Licencia", System.DBNull.Value));

            if (marca != null)
                parametros.Add(new SqlParameter("@Marca", marca));
            else
                parametros.Add(new SqlParameter("@Marca", System.DBNull.Value));
            
            if (reloj <= 0)
                parametros.Add(new SqlParameter("@IdReloj", System.DBNull.Value));
            else
                parametros.Add(new SqlParameter("@IdReloj", reloj));

            List<Auto> autos = base.Select<Auto>(where, 
                delegate(IPersistibleModelo iPer){
                return (string.IsNullOrEmpty(modelo) || ((Auto)iPer).Modelo.Contains(modelo) )&&
                      (string.IsNullOrEmpty(marca) || ((Auto)iPer).Marca == marca) &&
                      (string.IsNullOrEmpty(patente) || ((Auto)iPer).Patente.Contains(patente)) &&
                      (string.IsNullOrEmpty(licencia) || ((Auto)iPer).Licencia.Contains(licencia)) &&
                      (reloj <= 0 || ((Auto)iPer).Reloj.Id == reloj); 
                }
                , parametros);
            autos.Sort(delegate(Auto a1, Auto a2)
            {
                return a1.Id.CompareTo(a2.Id);
            });
            return autos;
        }


        protected override Predicate<IPersistibleModelo> FiltroXId(string id)
        {
            return delegate(IPersistibleModelo iPer)
            {
                return ((Auto)iPer).Id == long.Parse(id);
            };
        }

        public Auto Nuevo(string modelo, string marca, string patente, string licencia, string rodado, bool habilitado, Reloj reloj)
        {
            Auto a = new Auto();
            a.Modelo = modelo;
            a.Patente = patente;
            a.Licencia = licencia;
            a.Rodado = rodado;
            a.Habilitado = habilitado;
            a.Marca = marca;
            a.Reloj = reloj;
            base.Agregar(a);
            return a;
        }

        public List<Auto> SelectTodosHabilitados()
        {
            SqlCommand comm = new SqlCommand();
            string consulta = "SELECT * FROM " + this.NombreTabla + " WHERE Auto_Habilitado=1";
            comm.CommandText = consulta;
            return base.Select<Auto>(comm, delegate(IPersistibleModelo iPer) { return ((Auto)iPer).Habilitado; });
        }

        public List<Auto> MejorAuto(string desde, string hasta)
        {
            SqlCommand comm = new SqlCommand();
            string consulta = "SELECT top 5 A.Auto_Marca, A.Auto_Modelo, A.Auto_Patente, A.Auto_Licencia, SUM(V.Viaje_Cant_Fichas*T.Turno_Valor_Ficha + T.Turno_Valor_Bandera) Recaudacion";
            consulta+= " FROM NUESTRA_RUBIA_ES_MEJOR.Auto A JOIN NUESTRA_RUBIA_ES_MEJOR.Viaje V ON 	V.Viaje_Auto=A.Auto_Id AND V.Viaje_Consistente=1 JOIN NUESTRA_RUBIA_ES_MEJOR.Turno T ON ";
            consulta += " T.Turno_Id=V.Viaje_Turno where V.Viaje_Fecha>@Desde AND V.Viaje_Fecha<@Hasta GROUP BY A.Auto_Marca, A.Auto_Modelo, A.Auto_Patente, A.Auto_Licencia ORDER BY Recaudacion DESC";
            comm.CommandText = consulta;
            comm.Parameters.AddWithValue("@Desde", DateTime.Parse(desde));
            comm.Parameters.AddWithValue("@Hasta", DateTime.Parse(hasta));
            List<HashTableNCSensitive> resultado=this.Transaccion.EjecutarComando(comm, 5);
            List<Auto> autos = new List<Auto>();
            foreach (HashTableNCSensitive row in resultado)
            {
                Auto a = new Auto();
                ((IPersistibleModelo)a).Cargar(row);
                autos.Add(a);
            }
            return autos;
        }
    }
}
